/* 
    这个http.js 相当于 vue中封装axios的request.js文件
*/
import http from 'wechat-http'
// 配置基地址
http.baseURL = 'https://live-api.itheima.net'
// 将 http 模块， 添加到wx 全局对象中
wx.http = http

// 配置请求拦截器
http.intercept.request = (config) => {
  // console.log(config, '获取的请求拦截器的配置文件');
  // 获取token，判断token，如果有token的话,存入到、
  // 请求头header Authorization 中
  const token = getApp().token
  // 如果有token，并且不是刷新token的接口，给请求头添加token
  // refreshToken自己，添加刷新的header中携带的 refreshToken
  if (token && !config.url.includes('/refreshToken')) {
    // 如果访问的页面不需要请求参数 header，所以是undefined，
    // 所以做兼容，需要先声明一下，如果没有的情况，直接赋值空对象
    config.header = config.header || {}
    config.header.Authorization = token
  }
  return config
}
// 配置响应拦截器
http.intercept.response = async (res) => {
  // 如果token过期，需要自动刷新
  console.log(res, '获取的响应的数据');
  const refreshToken = getApp().refreshToken
  if (res.statusCode === 401) {
    // 如果请求的页面token过期，并且请求的地址包括刷新token的地址
    // 说明刷新token也失效了
    if (res.config.url.includes('/refreshToken')) {
      // 1. 此时说明refreshToken也过期了，应该退出登录，跳转登录页
      // 获取路由历史栈，拿到当前页的路由地址，用于登录成功后返回
      const pageStack = getCurrentPages()
      // console.log(pageStack, '获取到路由历史栈');
      // 获取到的当前页的路由地址
      const currentPage = pageStack[pageStack.length - 1]
      wx.redirectTo({
        // 在跳转登录页之前把当前页面路由地址，传给登录页，方便登陆成功返回
        url: `/pages/login/index?backUrl=/${currentPage.route}`
      })
      // 如果return没有返回值，请求的返回结果 为 undefined，
      // 导致undefined.code，此时会报错 
      return res.data
    }
    // 重新刷新token，请求刷新token的接口
    const { code, data } = await wx.http({
      url: '/refreshToken',
      method: 'post',
      header: {
        Authorization: refreshToken
      }
    })
    // console.log(res, '获取的刷新token接口，返回的新的token');
    // 如果返回的请求状态码，错误，提示，不往下执行
    if (code !== 10000) return wx.utils.toast()
    // 刷新全局的token
    getApp().setToken(data.token, data.refreshToken)
    // 优化出现401，刷新token之后，拿不到数据的问题，
    // 此时重新调用接口获取数据，使用户无感知体验 
    const result = await wx.http({
      ...res.config
    })
    console.log(result, '重新调用接口获取的数据');
    return result
  }
  // 剥离外壳
  return res.data
}